#include <bits/stdc++.h>
#define N 1002
using namespace std;
typedef long long ll;

int n, m;
struct Pnt { int x, y; };
vector <Pnt> ans;
bool swp=0;

int main ()
{
    freopen("bishop.in", "r", stdin);
    freopen("bishop.out", "w", stdout);
    
    scanf("%d %d", &n, &m);

    if (n==m && n==1) { printf("1\n1 1\n"); return 0; }

    printf("%d\n", n+m-1-((!(n&1) && !(m&1)) || (n==m)));

    // dfs(1, 0);
    if (n==m) {
        for (int i=1; i<=n; i++) { printf("1 %d\n", i); }
        for (int i=2; i<n; i++) { printf("%d %d\n", n, i); }
    }
    else {
        if (m<n) { swap(n, m); swp=1; }
        if (!(n&1) && !(m&1)) { n--; }
        if (n&1) {
            for (int i=1; i<=n; i++) { ans.push_back((Pnt){ i, 1 }); }
            for (int i=1; i<=n; i++) { ans.push_back((Pnt){ i, m }); }
            for (int j=((n+1)>>1)+1; j<=m-((n+1)>>1); j++) { ans.push_back((Pnt){ ((n+1)>>1), j }); }
        }
        else {
            for (int i=1; i<=n; i++) { ans.push_back((Pnt){ i, 1 }); }
            for (int i=1; i<=n; i++) { ans.push_back((Pnt){ i, m }); }
            for (int j=(n>>1)+2; j<=m-(n>>1)-1; j+=2) { ans.push_back((Pnt){ (n>>1), j }); ans.push_back((Pnt){ (n>>1)+1, j }); }
        }

        // printf("%d\n", ans.size());
        for (int i=0; i<(int)ans.size(); i++) {
            if (swp) { swap(ans[i].x, ans[i].y); }
            printf("%d %d\n", ans[i].x, ans[i].y);
        }
    }

    return 0;
}